//配置全局axios的代码文件
import axios from 'axios'
import Element from 'element-ui'
import router from '@/router'

//进行全局axios设置，需要定义一个新axios，进行全局设置
//myaxios就是进行了全局设置之后的对象，组件中使用myaxios对象
const myaxios = axios.create({
  timeout: 5000, //设置超时时间
})
//进行基础路径设置:  基础路径就请求Java服务器端路径前缀。 假设：http://localhost:10001
//目前开发阶段，使用是mockjs，没有地址前缀，后续生成环境中只需要解开。

myaxios.defaults.baseURL = '/sys'  
//验证码地址: /api/captcha    加上baseURL  地址变为：/sys/api/captcha

//设置axios请求携带token，进行全局设置。
//interceptors拦截器（请求前，请求之后(响应数据之前)）
myaxios.interceptors.request.use(config => {
  //从localStorage取出token，设置到axios的请求头中。这样请求头中就会含有token信息。
  config.headers['TOKEN'] = JSON.parse(localStorage.getItem('TOKEN'))  //去掉双引号
  return config
})

//对于axios响应状态(包括20000，或者失败)做全局处理。
myaxios.interceptors.response.use(
  response => {
    let Result = response.data //从响应对象中获得服务器端返回Result对象
    //如果状态码是20000，就执行axios请求后then()回调，否则执行catch()回调。
    if (Result.code == 20000) {
      return response //如果请求成功，就将response对象传递到组件axios请求方法的then()方法中
    } else {
     
      //不是20000,那就是各种请求失败错误码，直接进行错误的提示
      Element.Message.error(Result.message ? Result.message : '系统异常', {
        duration: 1000,
      })
      return Promise.reject(response.data.message)
    }
  },
  error => {
    //error中是对http请求不同错误状态码做的判断。
    if (error) {
      error.message = error.response.data.message
    }
    //error错误不是Java程序返回的，而是HTTP请求错误。404，500
    if (error.response.status == 401) {
      //Java服务器上的API接口方法是权限限制，当前登录用户没有权限访问时，会报401错误。
      router.push('/login').catch(e=>{}) 
      console.log(error.message);
      return Promise.reject(error)
    }
    if (error.response.status == 404) {
      //如果请求状态为404，找不到访问资源。页码自动跳转至NotFound.vue
      router.push('/notfound')
      return Promise.reject(error)
    }
    if (error.response.status == 400) {
      //如果状态码为400，就是请求Java服务器端方法方式错误（错误请求）。就是没有按照Java方法定义 要求来 使用vue进行请求。
      error.message = '请求服务器端方法错误'
    }
    if (error.response.status == 500) {
      //如果状态码为500，Java的代码错误。Vue--->Java报500(就是Java代码错误)
      error.message = '服务器代码错误'
    }
    
    Element.Message.error(error.message, {
      duration: 1000,
    })
    return Promise.reject(error)
  }
)

//导出myaxios
export default myaxios
